package com.whfc.emp.dao;

import com.whfc.emp.entity.AppWorkPlan;
import com.whfc.entity.dto.Apply.rep.WorkPlan;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 工作计划表 Mapper 接口
 * 对应数据库表：work_plan
 */
public interface AppWorkPlanMapper {

    /**
     * 根据主键ID查询工作计划
     * 
     * @param id 工作计划ID（bigint类型）
     * @return 工作计划实体
     */
    AppWorkPlan selectByPrimaryKey(Integer id);

    /**
     * 逻辑删除工作计划（更新is_deleted=1）
     * 
     * @param id 工作计划ID
     * @return 影响行数
     */
    int deleteByPrimaryKey(Long id);

    /**
     * 全字段插入工作计划
     * 
     * @param record 工作计划实体（需包含所有非自增字段）
     * @return 影响行数
     */
    int insert(AppWorkPlan record);

    /**
     * 选择性插入工作计划（仅插入非null字段）
     * 
     * @param record 工作计划实体
     * @return 影响行数
     */
    int insertSelective(AppWorkPlan record);

    /**
     * 选择性更新工作计划（仅更新非null字段）
     * 
     * @param record 工作计划实体（需包含主键id）
     * @return 影响行数
     */
    int updateByPrimaryKeySelective(AppWorkPlan record);

    /**
     * 全字段更新工作计划
     * 
     * @param record 工作计划实体（需包含主键id和所有字段值）
     * @return 影响行数
     */
    int updateByPrimaryKey(AppWorkPlan record);

    /**
     * 自定义查询：根据审核状态和创建人筛选工作计划列表
     * 
     * @param auditStatus  审核状态（0-待审核，1-通过，2-失败，3-审核中，可为null）
     * @param createUserId 创建人ID（可为null）
     * @return 工作计划列表
     */
    List<AppWorkPlan> selectWorkPlanList(
            @Param("auditStatus") Integer auditStatus,
            @Param("createUserId") Long createUserId);

    /**
     * 自定义更新：更新工作计划的审核状态
     * 
     * @param record 包含id、auditStatus、auditUserId、auditRemark的实体
     * @return 影响行数
     */
    int updateAuditStatus(AppWorkPlan record);

    // List<WorkPlan> selectWorkPlanAddList(@Param("deptId") List<Integer>
    // deptId,@Param("createUserId") Integer createUserId);
    /**
     * 多条件查询工作计划列表
     * 
     * @param deptId          部门ID列表
     * @param createUserId    创建人ID
     * @param createTimeBegin 创建时间开始
     * @param createTimeEnd   创建时间结束
     * @return 工作计划列表
     */
    List<WorkPlan> selectWorkPlanAddList(@Param("deptId") List<Integer> deptId,
            @Param("createUserId") Integer createUserId,
            @Param("createTimeBegin") String createTimeBegin,
            @Param("createTimeEnd") String createTimeEnd);

    List<AppWorkPlan> selectAppWorkPlanList(Integer auditStatus, Integer userId, Integer id);

    WorkPlan getWorkPlanById(@Param("id") Integer id);

    /**
     * 查询工作计划列表（支持时间范围查询）
     */
    List<WorkPlan> selectWorkPlanListWithTimeRange(@Param("deptId") List<Integer> deptId,
            @Param("createUserId") Integer createUserId,
            @Param("createTimeBegin") String createTimeBegin,
            @Param("createTimeEnd") String createTimeEnd,
            @Param("startTimeBegin") LocalDateTime startTimeBegin,
            @Param("startTimeEnd") LocalDateTime startTimeEnd,
            @Param("endTimeBegin") LocalDateTime endTimeBegin,
            @Param("endTimeEnd") LocalDateTime endTimeEnd,
                                                   @Param("auditStatus") Integer auditStatus);

    /**
     * 根据工作区域查询当天有效工作计划
     *
     * @param workAreaId 工作区域ID
     * @param currentDate 当前日期（格式：yyyy-MM-dd）
     * @return 当天有效的工作计划列表
     */
    List<AppWorkPlan> selectValidPlansByWorkAreaAndDate(@Param("workAreaId") Integer workAreaId, 
                                                       @Param("currentDate") String currentDate);
}